package com.cskaoyan.javase.oop1._7exercise.program;

/**
 * 读程序题
 *
 * @since 14:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(18, "长风");
        // 18
        System.out.println(s.age);
        // 长风
        System.out.println(s.name);

        // 20.0
        System.out.println(s.var);
        // 1000.0
        System.out.println(s.cat.price);
    }
}

class Student {
    int age = 10;
    String name = "张三";
    double var = 20;

    public Student(int age) {
        System.out.println("Student age");
        this.age = age;
    }

    public Student() {
    }

    public Student(int age, String name) {
        this(age);
        System.out.println("Student age,name");
        this.name = name;
    }

    /*
        定义在类的成员位置的引用数据类型成员变量的显式赋值
        它和基本数据类型成员变量显式赋值不同,它需要new对象
        需要创建对象
        就需要执行该类的构造方法
     */
    Cat cat = new Cat(1000);
    Cat c2;
    /*
        以下代码放开会怎么样呢?
        在自身类的成员变量列表中,new自身对象
        会导致什么后果呢?
        成员变量的显式赋值会创建自身对象
        然后在新建的自身对象中,又需要新建自身对象
        ....
        这是构造方法的递归
        那么这种情况下,是栈溢出还是堆溢出呢?
        肯定是栈溢出,因为:
            1.堆内存非常大,即便是相同情况下,也是栈溢出
            2.堆内存中的对象存在GC,自动的垃圾回收

     */
    // Student s = new Student();
}

class Cat {
    double price;

    public Cat() {
    }

    public Cat(double price) {
        // 该语句第一行输出,因为它依赖于引用数据类型成员变量的显式赋值,会先于Student类的构造器执行
        System.out.println("Cat price");
        this.price = price;
    }
}